#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
using namespace std;
void handler(int signo)
{
    cout<<signo<<"2号被我修改了"<<endl;
}
void Print(sigset_t &pending)
{
    cout<<"Pending bitmap: "<<endl;
    for (int signo = 32; signo > 0; signo--)
    {
        if (sigismember(&pending, signo))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl;
}
int main()
{
    signal(2,handler);
    // 1.屏蔽2号
    sigset_t block, oblock;
    sigemptyset(&block);
    sigaddset(&block, 2);

    int n = sigprocmask(SIG_SETMASK, &block, &oblock);

    cout << "block 2 signal sucess!" << endl;

    while (true)
    {
        // 2.获取进程的pending位图
        sigset_t pending;
        sigemptyset(&pending);
        n - sigpending(&pending);

        // 3.打印pending位图的所有信号
        Print(pending);
        
        int cnt = 0;
        cnt++;

        // 4.解除对2号信号的屏蔽
        if (cnt == 20)
        {
            cout << "!!!!!!!!!!!!!!" << endl;
            sigprocmask(SIG_UNBLOCK, &block, &oblock);
        }
    }
}

// int g_cnt=0;

// void handler(int signo)
// {
//     cout<<"pid: "<<getpid()<<endl;
//     unsigned int n=alarm(5);

//     cout<<"剩下多少时间： "<<n<<endl;
//     //exit(0);
// }
// int main()
// {
//     signal(SIGALRM,handler);
//     alarm(500);
//     while(true)
//     {
//         sleep(1);
//         cout<<"num: "<<g_cnt++<<" pid: "<<getpid()<<endl;
//     }
//     return 0;
// }

// void handler(int signo)
// {
//     cout<<"get a sig,number is: "<<signo<<endl;
//     exit(1);
// }

// int main()
// {
//     signal(SIGINT,handler);
//     while(true)
//     {
//         cout<<"I am process,pid: "<<getpid()<<endl;
//     }
//     return 0;
// }